#include <iostream>
#include <string>
#include <regex>

int main()
{

    // HTTP请求行格式：  GET /bitejiuyeke/login?user=xiaoming&pass=123123 HTTP/1.1\r\n
    std::string str = "get /bitejiuyeke/login?user=xiaoming&pass=123123 HTTP/1.1\r\n";
    std::smatch matches;

    // 请求方法的匹配  GET HEAD POST PUT DELETE ....
    std::regex e("(GET|HEAD|POST|PUT|DELETE) ([^?\s]+)(?:\\?([^\s]+))? (HTTP/1\\.[01])(?:\n|\r\n)?", std::regex::icase);
    // GET|HEAD|POST|PUT|DELETE   表示匹配并提取其中任意一个字符串
    //[^?\s]+     [^?]匹配非问号字符, \s表示空白字符(如空格、制表符、换行等) +表示1次或多次
    //\\?(.*)   \\?  表示原始的? 字符 (.*)表示提取?之后的任意字符0次或多次, 直到遇到空格, 开销较大
    // HTTP/1\\.[01]  表示匹配以HTTP/1.开始，后边有个0或1的字符串
    //(?:\n|\r\n)?   （?: ...） 表示匹配字符串...，但是不提取...， ?表示的是匹配前边的表达式0次或1次
    // 使用R"( ... )" 原生字符串 可以避免对反斜杠进行双重转义

    bool ret = std::regex_match(str, matches, e);
    if (ret == false)
    {
        std::cout << "请求方法不合法" << std::endl;
        return -1;
    }
    std::string method = matches[1];
    std::cout << "请求方法: " << method << std::endl;
    std::transform(method.begin(), method.end(), method.begin(), ::toupper);
    std::cout << method << std::endl;
    for (size_t i = 0; i < matches.size(); i++)
    {
        std::cout << "matches[" << i << "]:" << matches[i] << std::endl;
    }

    return 0;
}